跳到主要内容

游戏 UI 控制器(GameUIController)

相关源文件

GameUIControllerGameScene 的 UI 状态管理与编排系统。它负责初始化 GameUI 容器、管理菜单生命周期、协调暂停状态、处理交互提示,并提供存/读档集成。该控制器与 GameInputController 并行工作(见 GameInputController),后者负责底层键盘输入处理。

关于 InventoryLayerSkillBar 等具体 UI 组件,请参见 Player UI Components


概览与架构

GameUIController 充当 UI 层的状态机协调器。它不直接处理输入事件;而是接收来自 GameInputController 的回调,并据此进行 UI 状态切换。控制器维护多种状态标记,用于追踪哪些菜单处于激活状态,并实现优先级层级以防止冲突 UI 状态同时出现。

组件层级

来源Adventure-King/Classes/Scenes/GameUIController.h L16-L83

Adventure-King/Classes/GameUI.h L32-L270

职责分离

组件职责
GameInputController处理原始键盘事件(EventKeyboard::KeyCode),更新玩家物理速度,处理落地检测
GameUIController管理 UI 状态机(暂停、背包、死亡),协调菜单显示/隐藏,对 UI 刷新做节流
GameUIUI 元素容器节点,提供 child UI 的便捷访问与绑定入口

Toast 提示机制

showToast(text, color) 用固定 tag(TOAST_TAG = 88001)保证同一时刻只显示一条提示,避免连续保存/连续点击导致屏幕堆叠。

实现: GameUIController.cpp L318-L355

固定 tag 机制(TOAST_TAG = 88001)确保任一时刻仅显示一个 toast,避免由于快速连续存档等用户行为造成信息刷屏。

常见用途:

来源Adventure-King/Classes/Scenes/GameUIController.cpp L318-L355


与 GameScene 的集成

控制器作为“高层场景逻辑”与“底层 UI 组件”之间的桥梁:

回调流程图

来源Adventure-King/Classes/Scenes/GameUIController.cpp L32-L316

Adventure-King/Classes/Scenes/GameUIController.cpp L401-L445

GameScene 集成点

GameScene 在其 init() 中初始化控制器,并提供如下回调:

回调GameScene 中的实现用途
onReturnToMap缓存玩家数据,切换到 MapScene返回关卡选择
onPauseChanged切换 _physicsWorld->setSpeed() 与敌人更新暂停/恢复模拟
onRequestSave使用当前槽位调用 SaveManager::saveGame()手动存档
isPlayerAtGate用玩家位置与 gate rect 进行检测传送门交互提示
onLoadSuccess恢复玩家/世界状态,替换场景读档操作

来源:基于高层架构图与回调签名推导


汇总表

关键方法

方法触发方式主要职责
init()GameScene 初始化绑定回调、创建 GameUI、配置菜单
update(float)每帧轮询交互提示,对 UI 刷新做节流
togglePauseMenu()ESC 按键上下文敏感的暂停/取消暂停逻辑
toggleInventory()B 按键上下文敏感的背包打开/关闭
showDeathMenu()玩家 HP 归零显示死亡菜单并强制暂停
applyPostInventoryCloseState()关闭背包依据上下文标记切换到暂停或玩法状态
showToast()手动存档、错误等显示短暂的用户反馈信息

来源Adventure-King/Classes/Scenes/GameUIController.h L31-L53

状态切换保证

起始状态动作目标状态副作用
玩法(Gameplay)ESC暂停菜单(Pause Menu)禁用物理,_paused = true
暂停菜单(Pause Menu)ESC玩法(Gameplay)启用物理,_paused = false
暂停菜单(Pause Menu)点击 背包(Inventory)背包(Inventory)_inventoryReturnToPauseOnClose = true
玩法(Gameplay)B背包(Inventory)_inventoryReturnToPauseOnClose = false
背包(从暂停进入)关闭暂停菜单(Pause Menu)保持 _paused = true
背包(从玩法进入)关闭玩法(Gameplay)设置 _paused = false
任意状态玩家死亡死亡菜单(Death Menu)隐藏其他 UI,阻断输入

来源Adventure-King/Classes/Scenes/GameUIController.cpp L401-L532